package com.atguigu.service.oss.service.impl;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.atguigu.guli.service.base.exception.GuliException;
import com.atguigu.guli.service.base.result.ResultCodeEnum;
import com.atguigu.service.oss.service.OssUpdateImageService;
import com.atguigu.service.oss.utils.OssProperties;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.util.UUID;

@Service
public class OssUpdateImageServiceImpl implements OssUpdateImageService {

    @Autowired
    OssProperties ossProperties;
    // Endpoint以杭州为例，其它Region请按实际情况填写。
    String schema;
    String endpoint;
    // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
    String accessKeyId;
    String accessKeySecret;
    String bucketName;

    //当前类的构造器执行完毕后，立即初始化成员变量的值
    @PostConstruct //jdk提供的 bean的构造器后立即执行的初始化方法
    public void init(){
        this.schema = ossProperties.getSchema();
        this.endpoint = ossProperties.getEndpoint();
        this.accessKeySecret = ossProperties.getAccessKeySecret();
        this.accessKeyId = ossProperties.getAccessKeyId();
        this.bucketName = ossProperties.getBucketName();
    }

    /**
     * 讲师头像上传
     * @param file 文件
     * @param module 文件夹名称
     * @return
     */
    @Override
    public String updateImage(MultipartFile file, String module) {
        try {
            OSS ossClient = new OSSClientBuilder().build(schema + endpoint, accessKeyId, accessKeySecret);
            InputStream inputStream  = file.getInputStream();
            String originalFilename = file.getOriginalFilename();//文件名称
            String fileName = UUID.randomUUID().toString().replace("-", "") +
                    originalFilename.substring(originalFilename.lastIndexOf("."));
            String dateStr = new DateTime().toString("/yyyy/MM/dd/");
            ossClient.putObject(bucketName,
                    //key：表示文件保存在桶内的 路径+文件名
                    module + dateStr + fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //获取上传成功的文件地址
            return  schema + bucketName + "." + endpoint + "/" + module + dateStr + fileName;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 图片删除
     * @param path 文件路径
     * @param module 文件夹名称
     */
    public void deleteFile(String path, String module) {
        try {
            String objectName = path.substring(path.lastIndexOf(module));
            OSS ossClient = new OSSClientBuilder().build(schema+endpoint,
                    accessKeyId, accessKeySecret);
            // 删除文件或目录。如果要删除目录，目录必须为空。
            ossClient.deleteObject(bucketName, objectName);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            //抛出自定义异常
            throw new GuliException(ResultCodeEnum.FILE_DELETE_ERROR,e);
        }
    }
}
